package com.learn.algorithm_huixing;

import java.util.Scanner;

/**
 * 打印回形矩阵（正方形）
 *
 *      实现一个方法，输入一个参数n，返回一个n*n的二维数组，这个数组里的数字是按回形分布的
 *      例如 当n=4时
 *
 *       1  2  3 4
 *      12 13 14 5
 *      11 16 15 6
 *      10  9  8 7
 *
 * @author gatts, 2020/9/17 13:59
 */
public class GyrationMatrix {

    public static void main(String[] args) {
        System.out.println("请输入你想要打印的整数按回车键确认:");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        printN(n);
    }

    /**
     * 结合推导过程，比较容易理解的做法
     *
     * @param n
     */
    private static void printN(int n) {
        //- 二维数组存储结果
        int[][] arr = new int[n][n];
        //- 循环的终点
        int end = n * n;
        //- 初始direction，向右
        int direction = 1;
        //- 横纵坐标
        int i = 0, j = 0;

        for (int count = 1; count <= end; count++) {
            //- 向右
            if (direction == 1){
                if (j < n && arr[i][j] == 0){
                    System.out.println(String.format("1: [%d][%d] = %d", i, j, count));
                    arr[i][j] = count;
                    j++;
                }
                else {
                    j--;//- 补偿操作，因为上面的循环多进行了一步
                    direction = 2;//- 跳转到下一个循环
                    i++;//- 下一步操作准备
                    count--;//- 本次没有用到count的值，但是count++了，所以执行count--
                }
            }
            //- 向下
            else if (direction == 2){
                if (i < n && arr[i][j] == 0){
                    System.out.println(String.format("2: [%d][%d]", i, j));
                    arr[i][j] = count;
                    i++;
                }
                else {
                    i--;
                    direction = 3;
                    j--;
                    count--;
                }
            }
            //- 向左
            else if (direction == 3){
                if (j > -1 && arr[i][j] == 0){
                    System.out.println(String.format("3: [%d][%d]", i, j));
                    arr[i][j] = count;
                    j--;
                }
                else {
                    j++;
                    direction = 4;
                    i--;
                    count--;
                }
            }
            //- 向上
            else if (direction == 4){
                if (i > -1 && arr[i][j] == 0){
                    System.out.println(String.format("4: [%d][%d]", i, j));
                    arr[i][j] = count;
                    i--;
                }
                else {
                    i++;
                    direction = 1;
                    j++;
                    count--;
                }
            }
        }

        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
    }

}
